home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 February / PCWorld_2006-02_cd.bin / software / vyzkuste / triky / triky.exe / httrack-3.33.exe / {app} / src / htslib.h < prev    next >
C/C++ Source or Header  |  2005-02-05  |  19KB  |  515 lines

  1. /* ------------------------------------------------------------ */
  2. /*
  3. HTTrack Website Copier, Offline Browser for Windows and Unix
  4. Copyright (C) Xavier Roche and other contributors
  5.  
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  
  20.  
  21. Important notes:
  22.  
  23. - We hereby ask people using this source NOT to use it in purpose of grabbing
  24. emails addresses, or collecting any other private information on persons.
  25. This would disgrace our work, and spoil the many hours we spent on it.
  26.  
  27.  
  28. Please visit our Website: http://www.httrack.com
  29. */
  30.  
  31.  
  32. /* ------------------------------------------------------------ */
  33. /* File: Subroutines .h                                         */
  34. /* Author: Xavier Roche                                         */
  35. /* ------------------------------------------------------------ */
  36.  
  37. // Fichier librairie .h
  38.  
  39. #ifndef HTS_DEFH
  40. #define HTS_DEFH 
  41.  
  42. /* dΘfinitions globales */
  43. #include "htsglobal.h"
  44.  
  45. /* basic net definitions */
  46. #include "htsbase.h"
  47. #include "htsbasenet.h"
  48. #include "htsnet.h"
  49.  
  50. /* cookies et auth */
  51. #include "htsbauth.h"
  52.  
  53. // Attention, dΘfinition existante Θgalement dans le shell
  54. // (α modifier avec celle-ci)
  55. #define POSTTOK "?>post"
  56.  
  57. #include "htsopt.h"
  58.  
  59. #define READ_ERROR (-1)
  60. #define READ_EOF (-2)
  61. #define READ_TIMEOUT (-3)
  62. #define READ_INTERNAL_ERROR (-4)
  63.  
  64. // structure pour paramΦtres supplΘmentaires lors de la requΩte
  65. typedef struct htsrequest {
  66.   short int user_agent_send;  // user agent (ex: httrack/1.0 [sun])
  67.   short int http11;           // l'en tΩte peut (doit) Ωtre signΘ HTTP/1.1 et non HTTP/1.0
  68.   short int nokeepalive;      // pas de keep-alive
  69.   short int range_used;       // Range utilisΘ
  70.   short int nocompression;    // Pas de compression
  71.   short int flush_garbage;    // recycled
  72.   char user_agent[128];
  73.   char referer[256];
  74.   char from[256];
  75.   char lang_iso[64];
  76.   t_proxy proxy;              // proxy
  77. } htsrequest;
  78.  
  79.  
  80. // structure pour retour d'une connexion/prise d'en tΩte
  81. typedef struct htsblk {
  82.   int statuscode;        // status-code, -1=erreur, 200=OK,201=..etc (cf RFC1945)
  83.   short int notmodified; // page ou fichier NON modifiΘ (transfΘrΘ)
  84.   short int is_write;    // sortie sur disque (out) ou en mΘmoire (adr)
  85.   short int is_chunk;    // mode chunk
  86.   short int compressed;  // compressΘ?
  87.   short int empty;       // vide?
  88.   short int keep_alive;  // Keep-Alive?
  89.   short int keep_alive_trailers;  // ..with trailers extension
  90.   int keep_alive_t;      // KA timeout
  91.   int keep_alive_max;    // KA number of requests
  92.   char* adr;             // adresse du bloc de mΘmoire, NULL=vide
  93.   char* headers;         // adresse des en tΩtes si prΘsents
  94.   FILE* out;             // Θcriture directe sur disque (si is_write=1)
  95.   LLint size;            // taille fichier
  96.   char msg[80];          // message Θventuel si Θchec ("\0"=non prΘcisΘ)
  97.   char contenttype[64];  // content-type ("text/html" par exemple)
  98.   char charset[64];      // charset ("iso-8859-1" par exemple)
  99.   char contentencoding[64];  // content-encoding ("gzip" par exemple)
  100.   char* location;        // on copie dedans Θventuellement la vΘritable 'location'
  101.   LLint totalsize;       // taille totale α tΘlΘcharger (-1=inconnue)
  102.   short int is_file;     // ce n'est pas une socket mais un descripteur de fichier si 1
  103.   T_SOC soc;             // ID socket
  104.   SOCaddr address;       // IP address
  105.   int     address_size;  // IP address structure length
  106.   FILE* fp;              // fichier pour file://
  107. #if HTS_USEOPENSSL
  108.   short int ssl;         // is this connection a SSL one? (https)
  109.   // BIO* ssl_soc;          // SSL structure
  110.   SSL * ssl_con;         // connection structure
  111. #endif
  112.   char lastmodified[64]; // Last-Modified
  113.   char etag[64];         // Etag
  114.   char cdispo[256];      // Content-Disposition coupΘ
  115.   LLint  crange;         // Content-Range
  116.   int debugid;           // debug connection
  117.   /* */
  118.   htsrequest req;        // paramΦtres pour la requΩte
  119.   /*char digest[32+2];   // digest md5 gΘnΘrΘ par le moteur ("" si non gΘnΘrΘ)*/
  120. } htsblk;
  121.  
  122.  
  123. /* ANCIENNE STURCTURE pour cache 1.0 */
  124. typedef struct {
  125.   int statuscode;  // ANCIENNE STURCTURE - status-code, -1=erreur, 200=OK,201=..etc (cf RFC1945)
  126.   int notmodified; // ANCIENNE STURCTURE - page ou fichier NON modifiΘ (transfΘrΘ)
  127.   int is_write;    // ANCIENNE STURCTURE - sortie sur disque (out) ou en mΘmoire (adr)
  128.   char* adr;       // ANCIENNE STURCTURE - adresse du bloc de mΘmoire, NULL=vide
  129.   FILE* out;       // ANCIENNE STURCTURE - Θcriture directe sur disque (si is_write=1)
  130.   int size;        // ANCIENNE STURCTURE - taille fichier
  131.   char msg[80];    // ANCIENNE STURCTURE - message Θventuel si Θchec ("\0"=non prΘcisΘ)
  132.   char contenttype[64];  // ANCIENNE STURCTURE - content-type ("text/html" par exemple)
  133.   char* location;  // ANCIENNE STURCTURE - on copie dedans Θventuellement la vΘritable 'location'
  134.   int totalsize;   // ANCIENNE STURCTURE - taille totale α tΘlΘcharger (-1=inconnue)
  135.   int is_file;     // ANCIENNE STURCTURE - ce n'est pas une socket mais un descripteur de fichier si 1
  136.   T_SOC soc;       // ANCIENNE STURCTURE - ID socket
  137.   FILE* fp;        // ANCIENNE STURCTURE - fichier pour file://
  138.   t_proxy proxy;   // ANCIENNE STURCTURE - proxy
  139.   int user_agent_send;  // ANCIENNE STURCTURE - user agent (ex: httrack/1.0 [sun])
  140.   char user_agent[64];
  141.   int http11;           // ANCIENNE STURCTURE - l'en tΩte doit Ωtre signΘ HTTP/1.1 et non HTTP/1.0
  142. } OLD_htsblk;
  143. /* fin ANCIENNE STURCTURE pour cache 1.0 */
  144.  
  145. // cache pour le dns, pour Θviter de faire des gethostbyname sans arrΩt
  146. typedef struct t_dnscache {
  147.   char iadr[1024];
  148.   struct t_dnscache* n;
  149.   char host_addr[HTS_MAXADDRLEN];    // 4 octets (v4), ou 16 octets (v6)
  150.   int host_length;                   // 4 normalement - ==0  alors en cours de rΘsolution
  151.                                      // ou >16 si sockaddr
  152.                                      //                 ==-1 alors erreur (host n'Θxiste pas)
  153. } t_dnscache;
  154.  
  155.  
  156.  
  157. /* Library internal definictions */
  158. #ifdef HTS_INTERNAL_BYTECODE
  159.  
  160. // fonctions unix/winsock
  161. int hts_read(htsblk* r,char* buff,int size);
  162. //int HTS_TOTAL_RECV_CHECK(int var);
  163. LLint check_downloadable_bytes(int rate);
  164.  
  165. #ifndef HTTRACK_DEFLIB
  166. HTSEXT_API int hts_init(void);
  167. HTSEXT_API int hts_uninit(void);
  168. #endif
  169.  
  170. // fonctions principales
  171. int http_fopen(char* adr,char* fil,htsblk* retour);
  172. int http_xfopen(int mode,int treat,int waitconnect,char* xsend,char* adr,char* fil,htsblk* retour);
  173. int http_sendhead(t_cookie* cookie,int mode,char* xsend,char* adr,char* fil,char* referer_adr,char* referer_fil,htsblk* retour);
  174. htsblk httpget(char* url);
  175. //int newhttp(char* iadr,char* err=NULL);
  176. int newhttp(char* iadr,htsblk* retour,int port,int waitconnect);
  177. HTS_INLINE void deletehttp(htsblk* r);
  178. HTS_INLINE int  deleteaddr(htsblk* r);
  179. HTS_INLINE void deletesoc(T_SOC soc);
  180. HTS_INLINE void deletesoc_r(htsblk* r);
  181. htsblk http_location(char* adr,char* fil,char* loc);
  182. htsblk http_test(char* adr,char* fil,char* loc);
  183. int check_readinput(htsblk* r);
  184. int check_readinput_t(T_SOC soc, int timeout);
  185. void http_fread(T_SOC soc,htsblk* retour);
  186. LLint http_fread1(htsblk* r);
  187. void treathead(t_cookie* cookie,char* adr,char* fil,htsblk* retour,char* rcvd);
  188. void treatfirstline(htsblk* retour,char* rcvd);
  189. #ifndef HTTRACK_DEFLIB
  190. HTSEXT_API void infostatuscode(char* msg,int statuscode);
  191. #endif
  192.  
  193. // sous-fonctions
  194. htsblk xhttpget(char* adr,char* fil);
  195. htsblk http_gethead(char* adr,char* fil);
  196. LLint http_xfread1(htsblk* r,int bufl);
  197. HTS_INLINE t_hostent* hts_gethostbyname(char* iadr, void* v_buffer);
  198. #ifndef HTTRACK_DEFLIB
  199. HTSEXT_API t_hostent* vxgethostbyname(char* hostname, void* v_buffer);
  200. #endif
  201. t_hostent* _hts_ghbn(t_dnscache* cache,char* iadr,t_hostent* retour);
  202. int ftp_available(void);
  203. #if HTS_DNSCACHE
  204. void hts_cache_free(t_dnscache* cache);
  205. int hts_dnstest(char* _iadr);
  206. t_dnscache* _hts_cache(void);
  207. int _hts_lockdns(int i);
  208. #endif
  209.  
  210. // outils divers
  211. HTS_INLINE TStamp time_local(void);
  212. #ifndef HTTRACK_DEFLIB
  213. HTSEXT_API HTS_INLINE TStamp mtime_local(void);
  214. #endif
  215. void sec2str(char *s,TStamp t);
  216. #ifndef HTTRACK_DEFLIB
  217. HTSEXT_API void qsec2str(char *st,TStamp t);
  218. #endif
  219. void time_gmt_rfc822(char* s);
  220. void time_local_rfc822(char* s);
  221. struct tm* convert_time_rfc822(char* s);
  222. int set_filetime(char* file,struct tm* tm_time);
  223. int set_filetime_rfc822(char* file,char* date);
  224. int get_filetime_rfc822(char* file,char* date);
  225. HTS_INLINE void time_rfc822(char* s,struct tm * A);
  226. HTS_INLINE void time_rfc822_local(char* s,struct tm * A);
  227. #ifndef HTTRACK_DEFLIB
  228. HTSEXT_API char* int2char(int n);
  229. HTSEXT_API char* int2bytes(LLint n);
  230. HTSEXT_API char* int2bytessec(long int n);
  231. HTSEXT_API char** int2bytes2(LLint n);
  232. #endif
  233. HTS_INLINE int sendc(htsblk* r, char* s);
  234. int finput(int fd,char* s,int max);
  235. int binput(char* buff,char* s,int max);
  236. int linput(FILE* fp,char* s,int max);
  237. int linputsoc(T_SOC soc, char* s, int max);
  238. int linputsoc_t(T_SOC soc, char* s, int max, int timeout);
  239. int linput_trim(FILE* fp,char* s,int max);
  240. int linput_cpp(FILE* fp,char* s,int max);
  241. void rawlinput(FILE* fp,char* s,int max);
  242. char* strstrcase(char *s,char *o);
  243. int ident_url_absolute(char* url,char* adr,char* fil);
  244. void fil_simplifie(char* f);
  245. int is_unicode_utf8(unsigned char* buffer, unsigned int size);
  246. void map_characters(unsigned char* buffer, unsigned int size, unsigned int* map);
  247. int ishtml(const char* urlfil);
  248. int ishtml_ext(const char* a);
  249. int ishttperror(int err);
  250. void guess_httptype(char *s,const char *fil);
  251. void get_httptype(char *s,const char *fil,int flag);
  252. int get_userhttptype(int setdefs,char *s,const char *ext);
  253. void give_mimext(char *s,char *st);
  254. int is_knowntype(const char *fil);
  255. int is_userknowntype(const char *fil);
  256. int is_dyntype(const char *fil);
  257. char* get_ext(const char *fil);
  258. int may_unknown(const char* st);
  259. #ifndef HTTRACK_DEFLIB
  260. HTSEXT_API char* jump_identification(char*);
  261. HTSEXT_API char* jump_normalized(char*);
  262. HTSEXT_API char* jump_toport(char*);
  263. HTSEXT_API char* fil_normalized(char* source, char* dest);
  264. HTSEXT_API char* adr_normalized(char* source, char* dest);
  265. #endif
  266. char* strrchr_limit(char* s, char c, char* limit);
  267. char* strstr_limit(char* s, char* sub, char* limit);
  268. HTS_INLINE char* jump_protocol(char* source);
  269. void code64(unsigned char* a,int size_a,unsigned char* b,int crlf);
  270. #ifndef HTTRACK_DEFLIB
  271. HTSEXT_API void unescape_amp(char* s);
  272. HTSEXT_API void escape_spc_url(char* s);
  273. HTSEXT_API void escape_in_url(char* s);
  274. HTSEXT_API void escape_uri(char* s);
  275. HTSEXT_API void escape_uri_utf(char* s);
  276. HTSEXT_API void escape_check_url(char* s);
  277. HTSEXT_API char* escape_check_url_addr(char* s);
  278. HTSEXT_API void x_escape_http(char* s,int mode);
  279. HTSEXT_API void x_escape_html(char* s);
  280. HTSEXT_API void escape_remove_control(char* s);
  281. HTSEXT_API void escape_for_html_print(char* s, char* d);
  282. HTSEXT_API void escape_for_html_print_full(char* s, char* d);
  283. #endif
  284. #ifndef HTTRACK_DEFLIB
  285. HTSEXT_API char* unescape_http(char* s);
  286. HTSEXT_API char* unescape_http_unharm(char* s, int no_high);
  287. HTSEXT_API char* antislash_unescaped(char* s);
  288. #endif
  289. char* concat(const char* a,const char* b);
  290. #define copychar(a) concat((a),NULL)
  291. #if HTS_DOSNAME
  292. char* fconcat(char* a,char* b);
  293. char* fconv(char* a);
  294. #else
  295. #define fconv(a) (a)
  296. #define fconcat(a,b) concat(a,b)
  297. #endif
  298. char* fslash(char* a);
  299. char* __fslash(char* a);
  300.  
  301. char* convtolower(char* a);
  302. char* concat(const char* a,const char* b);
  303. void hts_lowcase(char* s);
  304. void hts_replace(char *s,char from,char to);
  305.  
  306.  
  307. void fprintfio(FILE* fp,char* buff,char* prefix);
  308.  
  309. #if HTS_WIN
  310. #else
  311. int sig_ignore_flag( int setflag );     // flag ignore
  312. #endif
  313.  
  314. void cut_path(char* fullpath,char* path,char* pname);
  315. int fexist(char* s);
  316. /*LLint fsize(char* s);    */
  317. INTsys fpsize(FILE* fp);
  318. INTsys fsize(char* s);    
  319. /* root dir */
  320. #ifndef HTTRACK_DEFLIB
  321. HTSEXT_API char* hts_rootdir(char* file);
  322. #endif
  323.  
  324. // Threads
  325. #if USE_PTHREAD
  326. typedef void* ( *beginthread_type )( void * );
  327. unsigned long _beginthread( beginthread_type start_address, unsigned stack_size, void *arglist );
  328. #endif
  329.  
  330.  
  331.  
  332.  
  333. /* variables globales */
  334. //extern LLint HTS_TOTAL_RECV;  // flux entrant reτu
  335. //extern int HTS_TOTAL_RECV_STATE;  // status: 0 tout va bien 1: ralentir un peu 2: ralentir 3: beaucoup
  336. extern HTSEXT_API hts_stat_struct HTS_STAT;
  337. extern int _DEBUG_HEAD;
  338. extern FILE* ioinfo;
  339.  
  340. /* constantes */
  341. extern const char* hts_mime_keep[];
  342. extern const char* hts_mime[][2];
  343. extern const char* hts_main_mime[];
  344. extern const char* hts_detect[];
  345. extern const char* hts_detectbeg[];
  346. extern const char* hts_nodetect[];
  347. extern const char* hts_detectURL[];
  348. extern const char* hts_detectandleave[];
  349. extern const char* hts_detect_js[];
  350.  
  351. // defaut wrappers
  352. void  __cdecl htsdefault_init(void);
  353. void  __cdecl htsdefault_uninit(void);
  354. int   __cdecl htsdefault_start(void* opt);
  355. int   __cdecl htsdefault_chopt(void* opt);
  356. int   __cdecl htsdefault_end(void);
  357. int   __cdecl htsdefault_preprocesshtml(char** html,int* len,char* url_adresse,char* url_fichier);
  358. int   __cdecl htsdefault_postprocesshtml(char** html,int* len,char* url_adresse,char* url_fichier);
  359. int   __cdecl htsdefault_checkhtml(char* html,int len,char* url_adresse,char* url_fichier);
  360. int   __cdecl htsdefault_loop(void* back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats);
  361. char* __cdecl htsdefault_query(char* question);
  362. char* __cdecl htsdefault_query2(char* question);
  363. char* __cdecl htsdefault_query3(char* question);
  364. int   __cdecl htsdefault_check(char* adr,char* fil,int status);
  365. void  __cdecl htsdefault_pause(char* lockfile);
  366. void  __cdecl htsdefault_filesave(char*);
  367. int   __cdecl htsdefault_linkdetected(char* link);
  368. int   __cdecl htsdefault_linkdetected2(char* link, char* tag_start);
  369. int   __cdecl htsdefault_xfrstatus(void* back);
  370. int   __cdecl htsdefault_savename(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save);
  371. int   __cdecl htsdefault_sendheader(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* outgoing);
  372. int   __cdecl htsdefault_receiveheader(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* incoming);
  373.  
  374. // end defaut wrappers
  375.  
  376.  
  377. // htsmodule.c definitions
  378. extern void* getFunctionPtr(httrackp* opt, char* file, char* fncname);
  379. extern void clearCallbacks(htscallbacks* chain);
  380.  
  381.  
  382.  
  383. #endif    // internals
  384.  
  385.  
  386. /* Spaces: CR,LF,TAB,FF */
  387. #define  is_space(c)      ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') )
  388. #define  is_realspace(c)  ( ((c)==' ')                || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11)                )
  389. #define  is_taborspace(c) ( ((c)==' ')                                          || ((c)==9)                             )
  390. #define  is_quote(c)      (               ((c)=='\"')                                                    || ((c)=='\'') )
  391. #define  is_retorsep(c)   (                              ((c)==10) || ((c)==13) || ((c)==9)                                          )
  392. //HTS_INLINE int is_space(char);
  393. //HTS_INLINE int is_realspace(char);
  394.  
  395. // compare le dΘbut de f avec s et retourne la position de la fin
  396. // 'A=a' (case insensitive)
  397. static int strfield(const char* f,const char* s) {
  398.   int r=0;
  399.   while (streql(*f,*s) && ((*f)!=0) && ((*s)!=0)) { f++; s++; r++; }
  400.   if (*s==0)
  401.     return r;
  402.   else
  403.     return 0;
  404. }
  405. static int strcmpnocase(char* a,char* b) {
  406.   while(*a) {
  407.     int cmp = hichar(*a) - hichar(*b);
  408.     if (cmp != 0)
  409.       return cmp;
  410.     a++;
  411.     b++;
  412.   }
  413.   return 0;
  414. }
  415.  
  416. #ifdef _WIN32
  417. #define strcasecmp(a,b) stricmp(a,b)
  418. #define strncasecmp(a,b,n) strnicmp(a,b,n)
  419. #endif
  420.  
  421. #define strfield2(f,s) ( (strlen(f)!=strlen(s)) ? 0 : (strfield(f,s)) )
  422.  
  423. // is this MIME an hypertext MIME (text/html), html/js-style or other script/text type?
  424. #define HTS_HYPERTEXT_DEFAULT_MIME "text/html"
  425. #define is_hypertext_mime__(a) \
  426.   ( (strfield2((a),"text/html")!=0)\
  427.   || (strfield2((a),"application/x-javascript")!=0) \
  428.   || (strfield2((a),"text/css")!=0) \
  429.   /*|| (strfield2((a),"text/vnd.wap.wml")!=0)*/ \
  430.   || (strfield2((a),"image/svg+xml")!=0) \
  431.   || (strfield2((a),"image/svg-xml")!=0) \
  432.   /*|| (strfield2((a),"audio/x-pn-realaudio")!=0) */\
  433.   || (strfield2((a),"application/x-authorware-map")!=0) \
  434.   )
  435. #define may_be_hypertext_mime__(a) \
  436.    (\
  437.      (strfield2((a),"audio/x-pn-realaudio")!=0) \
  438.      || (strfield2((a),"audio/x-mpegurl")!=0) \
  439.   )
  440.  
  441.  
  442. /* Library internal definictions */
  443. #ifdef HTS_INTERNAL_BYTECODE
  444.  
  445. // check if (mime, file) is hypertext
  446. static int is_hypertext_mime(const char* mime, const char* file) {
  447.   if (is_hypertext_mime__(mime))
  448.     return 1;
  449.   if (may_unknown(mime)) {
  450.     char guessed[256];
  451.     guessed[0] = '\0';
  452.     guess_httptype(guessed, file);
  453.     return is_hypertext_mime__(guessed);
  454.   }
  455.   return 0;
  456. }
  457.  
  458. // check if (mime, file) might be "false" hypertext
  459. static int may_be_hypertext_mime(const char* mime, const char* file) {
  460.   if (may_be_hypertext_mime__(mime))
  461.     return 1;
  462.   if (file != NULL && file[0] != '\0' && may_unknown(mime)) {
  463.     char guessed[256];
  464.     guessed[0] = '\0';
  465.     guess_httptype(guessed, file);
  466.     return may_be_hypertext_mime__(guessed);
  467.   }
  468.   return 0;
  469. }
  470.  
  471. // compare (mime, file) with reference
  472. static int compare_mime(const char* mime, const char* file, const char* reference) {
  473.   if (is_hypertext_mime__(mime) || may_be_hypertext_mime__(mime))
  474.     return strfield2(mime, reference);
  475.   if (file != NULL && file[0] != '\0' && may_unknown(mime)) {
  476.     char guessed[256];
  477.     guessed[0] = '\0';
  478.     guess_httptype(guessed, file);
  479.     return strfield2(guessed, reference);
  480.   }
  481.   return 0;
  482. }
  483.  
  484. #endif
  485.  
  486. #ifdef _WIN32_WCE_XXC
  487. extern char cwd[MAX_PATH+1];
  488. static char *getcwd_ce(char *buffer, int maxlen)
  489. {
  490.     TCHAR fileUnc[MAX_PATH+1];
  491.     char* plast;
  492.     
  493.     if(cwd[0] == 0)
  494.     {
  495.         GetModuleFileName(NULL, fileUnc, MAX_PATH);
  496.         WideCharToMultiByte(CP_ACP, 0, fileUnc, -1, cwd, MAX_PATH, NULL, NULL);
  497.         plast = strrchr(cwd, '\\');
  498.         if(plast)
  499.             *plast = 0;
  500.         /* Special trick to keep start menu clean... */
  501.         if(_stricmp(cwd, "\\windows\\start menu") == 0)
  502.             strcpy(cwd, "\\Apps");
  503.     }
  504.     if(buffer)
  505.         strncpy(buffer, cwd, maxlen);
  506.     return cwd;
  507. }
  508. #undef getcwd
  509. #define getcwd getcwd_ce
  510. #endif
  511.  
  512. #endif
  513.  
  514.  
  515.